import numpy as np
import matplotlib.pyplot as plt

#按顺序构成的模型,最简单的，一层层的.
from keras.models import Sequential

# 全连接层,和激活函数
from keras.layers import Dense,Activation

#从优化器里到处SGD
from keras.optimizers import SGD

#生成200个从-0.5到0.5的数字
x_date=np.linspace(-0.5,0.5,200)

#记入噪音
noise=np.random.normal(0,0.02,x_date.shape)


#y 是平方后的 + 噪音
y_data=np.square(x_date)+noise


# 把点显示出来看一下;

plt.scatter(x_date,y_data)
plt.show()

#上一节只有一层的神经网络，很难拟合出来复杂的曲线；
#下边要两层才行;
# dim 维度.

#自定义优化算法
#使用 ctrl + Q 函数说明快捷方式.



#网络结构 1-10-1
model=Sequential()
model.add(Dense(units=10,input_dim=1)) #指定中间层和输出层.
model.add(Activation('tanh'))#添加激活函数
model.add(Dense(units=1,activation="tanh"))   #此处的输入不需要参加，会根据上边自动的生成
#model.add(Activation('tanh'))#添加激活函数，也可以从里面添加

#使用 tanh 比较光滑，使用 relu 比较硬

#添加损失函数和优化算法;
sgd=SGD(lr=0.3)  #由原来默认的0.1改成0.3
model.compile(optimizer=sgd,loss="mse")#优化函数不需要使用引号


#算上 3000 次

for step in range(3001):
    cost=model.train_on_batch(x_date,y_data)
    if step%500==0:
        print("cost ******* ",cost)

#打印出预测值

y_pred=model.predict(x_date)

#画出来看一下;
plt.scatter(x_date,y_data)
plt.plot(x_date,y_pred,"r-",lw=3)
plt.show()

#使用sgd 是不行的，学习率太小，需要迭代的次数过多。
